using System;
using System.Collections;
using Server;
using Server.Gumps;
using Server.Multis;
using Server.Network;
using Server.ContextMenus;
using Server.Engines.PartySystem;

namespace Server.Items
{
	[Flipable]
	public class ParagonChest : LockableContainer
	{
		private static int[] m_ItemIDs = new int[]
		{
			0x9AB, 0xE40, 0xE41, 0xE7C
		};

		private static int[] m_Hues = new int[]
		{
			0x0, 0x455, 0x47E, 0x89F, 0x8A5, 0x8AB, 
			0x966, 0x96D, 0x972, 0x973, 0x979
		};

		private string m_Name;

		[Constructable]
		public ParagonChest( string name, int level ) : base( Utility.RandomList( m_ItemIDs ) )
		{
			m_Name = name;
			Hue = Utility.RandomList( m_Hues );
			Fill( level );
		}

		public override void OnSingleClick( Mobile from )
		{
			LabelTo( from, 1063449, m_Name );
		}

		public override void GetProperties( ObjectPropertyList list )
		{
			base.GetProperties( list );

			list.Add( 1063449, m_Name );
		}

		private static void GetRandomAOSStats( out int attributeCount, out int min, out int max )
		{
			int rnd = Utility.Random( 15 );

			if ( rnd < 1 )
			{
				attributeCount = Utility.RandomMinMax( 2, 6 );
				min = 20; max = 70;
			}
			else if ( rnd < 3 )
			{
				attributeCount = Utility.RandomMinMax( 2, 4 );
				min = 20; max = 50;
			}
			else if ( rnd < 6 )
			{
				attributeCount = Utility.RandomMinMax( 2, 3 );
				min = 20; max = 40;
			}
			else if ( rnd < 10 )
			{
				attributeCount = Utility.RandomMinMax( 1, 2 );
				min = 10; max = 30;
			}
			else
			{
				attributeCount = 1;
				min = 10; max = 20;
			}
		}
		
		public void Flip()
		{
			switch ( ItemID )
			{
				case 0x9AB : ItemID = 0xE7C; break;
				case 0xE7C : ItemID = 0x9AB; break;
				
				case 0xE40 : ItemID = 0xE41; break;
				case 0xE41 : ItemID = 0xE40; break;
			}
		}

		private void Fill( int level )
		{
			TrapType = TrapType.ExplosionTrap;
			TrapPower = level * 25;
			TrapLevel = level;
			Locked = true;

			switch ( level )
			{
				case 1: RequiredSkill = 36; break;
				case 2: RequiredSkill = 76; break;
				case 3: RequiredSkill = 84; break;
				case 4: RequiredSkill = 92; break;
				case 5: RequiredSkill = 100; break;
			}

			LockLevel = RequiredSkill - 10;
			MaxLockLevel = RequiredSkill + 40;

			DropItem( new Gold( level * 200 ) );

			for ( int i = 0; i < level; ++i )
				DropItem( Loot.RandomScroll( 0, 63, SpellbookType.Regular ) );

			for ( int i = 0; i < level * 2; ++i )
			{
				Item item;

				if ( Core.AOS )
					item = Loot.RandomArmorOrShieldOrWeaponOrJewelry();
				else
					item = Loot.RandomArmorOrShieldOrWeapon();

				if ( item is BaseWeapon )
				{
					BaseWeapon weapon = (BaseWeapon)item;

					if ( Core.AOS )
					{
						int attributeCount;
						int min, max;

						GetRandomAOSStats( out attributeCount, out min, out max );

						BaseRunicTool.ApplyAttributesTo( weapon, attributeCount, min, max );
					}
					else
					{
						weapon.DamageLevel = (WeaponDamageLevel)Utility.Random( 6 );
						weapon.AccuracyLevel = (WeaponAccuracyLevel)Utility.Random( 6 );
						weapon.DurabilityLevel = (WeaponDurabilityLevel)Utility.Random( 6 );
					}

					DropItem( item );
				}
				else if ( item is BaseArmor )
				{
					BaseArmor armor = (BaseArmor)item;

					if ( Core.AOS )
					{
						int attributeCount;
						int min, max;

						GetRandomAOSStats( out attributeCount, out min, out max );

						BaseRunicTool.ApplyAttributesTo( armor, attributeCount, min, max );
					}
					else
					{
						armor.ProtectionLevel = (ArmorProtectionLevel)Utility.Random( 6 );
						armor.Durability = (ArmorDurabilityLevel)Utility.Random( 6 );
					}

					DropItem( item );
				}
				else if( item is BaseHat )
				{
					BaseHat hat = (BaseHat)item;

					if( Core.AOS )
					{
						int attributeCount;
						int min, max;

						GetRandomAOSStats( out attributeCount, out min, out  max );

						BaseRunicTool.ApplyAttributesTo( hat, attributeCount, min, max );
					}

					DropItem( item );
				}
				else if( item is BaseJewel )
				{
					int attributeCount;
					int min, max;

					GetRandomAOSStats( out attributeCount, out min, out max );

					BaseRunicTool.ApplyAttributesTo( (BaseJewel)item, attributeCount, min, max );

					DropItem( item );
				}
			}

			for ( int i = 0; i < level; i++ )
			{
				Item item = Loot.RandomPossibleReagent();
				item.Amount = Utility.RandomMinMax( 40, 60 );
				DropItem( item );
			}

			for ( int i = 0; i < level; i++ )
			{
				Item item = Loot.RandomGem();
				DropItem( item );
			}

			DropItem( new TreasureMap( level + 1, ( Utility.RandomBool() ? Map.Felucca : Map.Trammel ) ) );
		}

		public ParagonChest( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version

			writer.Write( m_Name );
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();

			m_Name = Utility.Intern( reader.ReadString() );
		}
	}
}
